home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / ada / gwuada_6.zip / FIND.C < prev    next >
C/C++ Source or Header  |  1993-07-05  |  8KB  |  273 lines

  1. /*
  2.     GWAda Development Environment for 386/486 PCs   
  3.     Copyright (C) 1993, Arthur Vargas Lopes  & Michael Bliss Feldman
  4.                         vlopes@vortex.ufrgs.br mfeldman@seas.gwu.edu
  5.  
  6.     This program is free software; you can redistribute it and/or modify
  7.     it under the terms of the GNU General Public License as published by
  8.     the Free Software Foundation; version 2 of the License.    
  9.  
  10.     This program is distributed in the hope that it will be useful,
  11.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.     GNU General Public License for more details.
  14.  
  15.     You should have received a copy of the GNU General Public License
  16.     along with this program; if not, write to the Free Software
  17.     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18. */
  19.  
  20. /*  find.c  */
  21.  
  22. #include <externs.h>
  23.  
  24.  
  25.  
  26. void AVL_PROCESS_FIND()
  27. {
  28.     AVL_FIND(1,"");
  29. }
  30.  
  31. void AVL_PROCESS_REPLACE()
  32. {
  33.     AVL_REPLACE(1);
  34. }
  35.  
  36.  
  37.  
  38. void AVL_FIND(int no,char *what)
  39. {
  40.     char f[AVL_MAX_LINEL+10];
  41.     AVL_EDIT_WINDOW_PTR w;
  42.     AVL_LINE_PTR temp, head = NULL;
  43.     struct rccoord old;
  44.     AVL_WIN_PTR m1 = NULL, m2;
  45.     int n1, n2, x, i, j, k, l, rp;
  46.     static char *msg = " GWAda - Find? ";
  47.     char msg2[80];
  48.     w = &avl_windows[avl_window];
  49.     old = _gettextposition();
  50.     n1 = 62;
  51.     n2 = (80 - n1) / 2;
  52.     if (strlen(what) == 0) {
  53.         m1 = AVL_MAKE_WINDOW(msg,7,n2,9,n1+n2,avl_wnd_bk_color,avl_wnd_color);
  54.         _settextposition(1,1);
  55.         rp = AVL_PROMPT(1,1,avl_find_txt,60);
  56.         if (rp) {
  57.             AVL_DEL_WINDOW(m1);
  58.             return;
  59.             }
  60.         }
  61.     else
  62.         strcpy(avl_find_txt,what);
  63.     temp = w -> current_line;
  64.     i = w -> txt_col;
  65.     while (temp != w -> head)  {
  66.         x = strlen(temp -> line) - (l = strlen(avl_find_txt));
  67.         for(j = i; j < x; ++j)  {
  68.             for(k = 0; k < l; ++k)
  69.                 if (toupper(avl_find_txt[k]) != toupper(temp -> line[j + k]))
  70.                     break;
  71.             if (k == l) { /* Found string here */
  72.                 w -> txt_col = j;
  73.                 w -> current_line = temp;
  74.                 if (strlen(what)) 
  75.                     if (strcmp(what,"$"))  {
  76.                         w -> current_line = w -> current_line -> previous;
  77.                         w -> current_line = w -> current_line -> previous;
  78.                         }
  79.                 w -> scr_row = 1;
  80.                 AVL_DEL_WINDOW(m1);
  81.                 _settextposition(1,1);
  82.                 AVL_UPDATE_SCREEN();
  83.                 return;
  84.                 }
  85.             }
  86.         temp = temp -> next;
  87.         }
  88.     if (!strlen(what))  {
  89.         sprintf(f,"Can't find: %s",avl_find_txt);
  90.         AVL_ERROR(f);
  91.         }
  92.     AVL_DEL_WINDOW(m1);
  93. }
  94.  
  95. void AVL_DO_REPLACE(int from, AVL_LINE_PTR w)
  96. {
  97.     int i, j, k, n, n2, min;
  98.     j = strlen(avl_find_txt);
  99.     k = strlen(avl_replace_txt);
  100.     n2 = strlen(w -> line);
  101.     min = (j > k) ? k : j;
  102.     for (i = 0; i < min; ++i)
  103.         w -> line[i+from] = avl_replace_txt[i];
  104.     if (j == k) return;
  105.     if (j > k) { /* Have to compress the line */
  106.         n = j - k; 
  107.         for(i = from + min; i <= (n2 - n); ++i)
  108.             w -> line[i] = w -> line[i+n];
  109.         }
  110.     else { /* Have to insert remaining replacement */ 
  111.         n = k - j;
  112.         /*  First shift n positions to the right */
  113.         for(i = n2 + n; i >= (from + min); --i)
  114.             w -> line[i] = w -> line[i-n];
  115.         j = min;
  116.         for(i = from + min; j < k; ++i)
  117.             w -> line[i] = avl_replace_txt[j++];
  118.         }
  119. }        
  120.  
  121. void AVL_REPLACE(int no)
  122. {
  123.     char f[AVL_MAX_LINEL+10];
  124.     char f2[AVL_MAX_LINEL+10];
  125.     char f3[AVL_MAX_LINEL+10];
  126.     char f3x[AVL_MAX_LINEL+10];
  127.     char rmsg[180];
  128.     char c;
  129.     AVL_EDIT_WINDOW_PTR w;
  130.     AVL_LINE_PTR temp, last_change, save_line;
  131.     struct rccoord old;
  132.     AVL_WIN_PTR m1, m2, hw2;
  133.     short n1, n2, x, i, j, k, l, question = 0;
  134.     short done = 0, rp, save_txt, save_row, jk;
  135.     static char *msg = " GWAda - Replace what? ";
  136.     static char *msg2 = " GWAda - Replace by? ";
  137.     if (no <= 0) no = 1;
  138.     w = &avl_windows[avl_window];
  139.     old = _gettextposition();
  140.     n1 = 62;
  141.     n2 = (80 - n1) / 2;
  142.     m1 = AVL_MAKE_WINDOW(msg,6,n2,8,n1+n2,avl_wnd_bk_color,avl_wnd_color);
  143.     _settextposition(1,1);
  144.     rp = AVL_PROMPT(1,1,avl_find_txt,60);
  145.     if (avl_find_txt[0] == '\0' || rp)  {
  146.         AVL_DEL_WINDOW(m1);
  147.         _settextposition(old.row,old.col);
  148.         return;
  149.         }
  150.     hw2 = AVL_MAKE_WINDOW(" Examples ",17,39,17+6,39+36,avl_wnd_bk_color,avl_wnd_color);
  151.     _outtext(" Enter:\n");
  152.     _outtext("    All --- replace all occurences\n");
  153.     _outtext("    3   --- replaces up to 3 times\n");
  154.     _outtext("    3?  --- replaces up to 3 times\n");
  155.     _outtext("            asking confirmation");
  156.     m2 = AVL_MAKE_WINDOW(msg2,10,n2,14,n1+n2,avl_wnd_bk_color,avl_wnd_color);
  157.     _settextposition(1,1);
  158.     rp = AVL_PROMPT(1,1,avl_replace_txt,60);
  159.     if (rp)  {
  160.         AVL_DEL_WINDOW(m2);
  161.         AVL_DEL_WINDOW(hw2);
  162.         AVL_DEL_WINDOW(m1);
  163.         _settextposition(old.row,old.col);
  164.         return;
  165.         }
  166.     _settextposition(3,2);
  167.     _outtext("Replace how many times? ");
  168.     strcpy(f3,"1");
  169.     rp = AVL_PROMPT(3,26,f3,6);
  170.     if (rp)  
  171.         f3[0] = '\0';
  172.     else {
  173.         strcpy(f3x,f3);
  174.         for(i = 0; i < strlen(f3); ++i)
  175.             if (f3[i] == '?')  {
  176.                 f3[i] = '\0';
  177.                 question = 1;
  178.                 break;
  179.                 }
  180.         }
  181.     if ((f3[0] == 'A' || f3[0] == 'a') &&
  182.         (f3[1] == 'L' || f3[1] == 'l') &&
  183.         (f3[2] == 'L' || f3[2] == 'l') && f3[3] == '\0') 
  184.         strcpy(f3,"5000");
  185.     AVL_DEL_WINDOW(m2);
  186.     AVL_DEL_WINDOW(hw2);
  187.     AVL_DEL_WINDOW(m1);
  188.     no = atoi(f3);
  189.     if (f3[0] == '\0' || no == 0)  {
  190.         _settextposition(old.row,old.col);
  191.         return;
  192.         }
  193.     save_line = w -> current_line;
  194.     save_txt = w -> txt_col;
  195.     save_row = w -> scr_row;
  196.     temp = w -> current_line;
  197.     i = w -> txt_col;
  198.     while (temp != w -> head)  {
  199.         x = strlen(temp -> line) - (l = strlen(avl_find_txt));
  200. /* was        for(j = i; j < x; ++j)  {  */
  201.         for(j = i; j <= x; ++j)  {
  202.             for(k = 0; k < l; ++k)
  203.                 if (toupper(avl_find_txt[k]) != toupper(temp -> line[j + k]))
  204.                     break;
  205.             if (k == l) { /* Found string here */
  206.                 if (question)  {
  207.                     w -> txt_col = j;
  208.                     w -> current_line = temp;
  209.                     w -> scr_row = 1;
  210.                     AVL_UPDATE_SCREEN();
  211.                     AVL_UPDATE_CURSOR();
  212.                     AVL_UPDATE_STATUS_LINE();
  213.                     for(jk = w -> scr_col; jk < (w -> scr_col + l) && jk < 80 ; ++jk)  {
  214.                         c = *AVL_MAP(2,jk);
  215.                         AVL_WVIDEO(c,(unsigned char) 
  216.                             ((avl_men_bk_color + 16) << 4 | avl_men_letter)
  217.                               , AVL_MAP(2,jk));
  218.                         }
  219.                     _settextposition(1,2);
  220.                     sprintf(rmsg,"Replace (Y/N) ? ", avl_replace_txt);
  221.                     m1 = AVL_MAKE_WINDOW(msg,6,n2,8,n1+n2,avl_wnd_bk_color,avl_wnd_color);
  222.                     _settextposition(1,1);
  223.                     _outtext(avl_find_txt);
  224.                     m2 = AVL_MAKE_WINDOW(msg2,10,n2,14,n1+n2,avl_wnd_bk_color,avl_wnd_color);
  225.                     _settextposition(1,1);
  226.                     _outtext(avl_replace_txt);
  227.                     _settextposition(3,2);
  228.                     _outtext("Replace how many times? ");
  229.                     _outtext(f3x);
  230.                     if (AVL_QUESTION(rmsg) != 'Y')  {
  231.                         AVL_DEL_WINDOW(m2);
  232.                         AVL_DEL_WINDOW(m1);
  233.                         continue;
  234.                         }
  235.                     AVL_DEL_WINDOW(m2);
  236.                     AVL_DEL_WINDOW(m1);
  237.                     }
  238.                 w -> changed = 1;
  239.                 AVL_DO_REPLACE(j,temp);
  240.                 j += (strlen(avl_replace_txt) - 1);
  241.                 ++done;
  242.                 last_change = temp;
  243.                 if (--no == 0)  goto job_done;
  244.                 }
  245.             }
  246.         temp = temp -> next;
  247.         i = 0;
  248.         }
  249.  
  250. job_done:
  251.  
  252.     if (question && done)  {    
  253.         w -> current_line = save_line;
  254.         w -> txt_col = save_txt;
  255.         w -> scr_row = save_row;
  256.         }
  257.     if (!done)  {
  258.         sprintf(f,"Can't replace: %s",avl_find_txt);
  259.         AVL_ERROR(f);
  260.         }
  261.     else  {
  262.         w -> txt_col = j;
  263.         w -> current_line = last_change;
  264.         w -> scr_row = 1;
  265.         _settextposition(old.row,old.col);
  266.         AVL_UPDATE_SCREEN();
  267.         sprintf(f,"Replaced %s %d time%s",avl_find_txt,done, (done > 1) ? "s" : "");
  268.         AVL_TELL(f);
  269.         }
  270.     _settextposition(old.row,old.col);
  271. }
  272.  
  273.